﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TomanuExtensionsTest.TestClasses
{
    #pragma warning disable 0649
    #pragma warning disable 0169

    public interface I
    {
        int IP { get; set; }
        int IP1 { get; set; }
        int IPV { get; set; }
        int IPV1 { get; set; }
        int IPV2 { get; set; }
        int IPA { get; set; }
        int IPA2 { get; set; }

        void MK_interface_normal();
        void MK_interface_virtual();
        void MK_interface_abstract();
    }

    public interface J
    {
        int IP1 { get; set; }
        int IP2 { get; set; }
        int IPV1 { get; set; }
        int IPV2 { get; set; }
        int IPV3 { get; set; }

        void ML_interface_normal();
        void ML_interface_virtual();
    }

    public abstract class AC : I
    {
        private int A;
        protected int B;
        public int C;
        
        private int D { get; set; }
        protected int E { get; set; }
        public int F { get; set; }
        
        protected abstract int G { get; set; }
        public abstract int H { get; set; }
        
        protected virtual int J { get; set; }
        public virtual int K { get; set; }
        
        protected virtual int L { get; set; }
        public virtual int M { get; set; }
        
        protected virtual int P { get; set; }
        public virtual int R { get; set; }
        
        protected virtual int Q { get; set; }
        public virtual int S { get; set; }
        
        protected int T { get; set; }
        public int U { get; set; }
        
        public int IP { get; set; }
        public int IP1 { get; set; }

        public virtual int IPV { get; set; }
        public virtual int IPV1 { get; set; }
        public virtual int IPV2 { get; set; }
        public abstract int IPA { get; set; }
        public abstract int IPA2 { get; set; }

        private void MA_only_here() { }
        protected void MA_only_here(string x) { }
        public void MA_only_here(byte x) { }
        protected void MA_only_here_params(byte x) { }
        protected void MA_only_here_params(int x) { }
        protected void MA_only_here_params(ref int x) { }
        protected void MAA_only_here_params1(int x) { }
        protected void MAA_only_here_params2(out int x) { x = 5; }
        protected void MA_only_here_params(params int[] x) { }
        private void MA_new() { }//
        protected void MB_new() { }
        protected void MB_def_params(int x) { }
        protected virtual void MC_virt_only_here() { }
        protected virtual void MC_virt_only_here_params() { }
        protected virtual void MC_virt_only_here_params(int x) { }
        public abstract void MD_abstract();
        protected virtual void ME_override(int x) { }
        protected virtual void ME_override(short x) { }
        protected virtual void ME_override(long x) { }
        protected virtual void MG_virt_new() { }
        protected virtual void MG_virt_new_params() { }
        protected virtual void MG_virt_new_params(int x) { }
        protected virtual void MG_virt_new_params(short x) { }
        protected virtual void MH_name(short x) { }
        public void MK_interface_normal() { }
        public virtual void MK_interface_virtual() { }
        public abstract void MK_interface_abstract();
    }

    public class BC : AC, J
    {
        private int A;
        new protected int B;
        new public int C;
        
        private int A1;
        protected int B1;
        public int C1;
        
        private int D { get; set; }
        new protected int E { get; set; }
        new public int F { get; set; }
        
        private int D1 { get; set; }
        protected int E1 { get; set; }
        public int F2 { get; set; }
        
        protected virtual int E2 { get; set; }
        public virtual int F3 { get; set; }
        
        protected override int G { get; set; }
        public override int H { get; set; }
        
        protected override int J { get; set; }
        public override int K { get; set; }
        
        new protected virtual int P { get; set; }
        new public virtual int R { get; set; }
        
        new protected int Q { get; set; }
        new public int S { get; set; }
        
        new protected virtual int T { get; set; }
        new public virtual int U { get; set; }
        
        new public int IP1 { get; set; }
        public int IP2 { get; set; }
        new public int IPV1 { get; set; }
        new public virtual int IPV2 { get; set; }
        public int IPV3 { get; set; }
        
        public override int IPA { get; set; }
        public override int IPA2 { get; set; }
        
        private void MA_new() { }
        new protected void MB_new() { }
        new protected void MB_def_params(int x = 56) { }
        public override void MD_abstract() { }
        protected override void ME_override(int x) { }
        protected override void ME_override(short x) { }
        protected override void ME_override(long x = 45) { }
        protected virtual void MF_virt_only_here() { }
        protected virtual void MF_virt_only_here_params() { }
        protected virtual void MF_virt_only_here_params(int x) { }
        new protected virtual void MG_virt_new() { }
        new protected virtual void MG_virt_new_params() { }
        new protected virtual void MG_virt_new_params(int x) { }
        new protected virtual void MG_virt_new_params(short x = 45) { }
        private void MH_only_here(short d) { }
        protected void MH_only_here() { }
        public void MH_only_here(int x) { }
        protected override void MH_name(short y) { }
        public override void MK_interface_abstract() { }
        public void ML_interface_normal() { }
        public virtual void ML_interface_virtual() { }
    }

    #pragma warning restore 0649
    #pragma warning restore 0169

    public abstract class A1
    {
        private int x1 { get; set; }
        protected int x2 { get; set; }
        public int x3 { get; set; }

        protected abstract int a1 { get; set; }
        protected abstract int a2 { get; set; }
        protected abstract int a3 { get; set; }

        protected virtual int v1 { get; set; }
        protected virtual int v2 { get; set; }
        protected virtual int v3 { get; set; }
        protected virtual int v4 { get; set; }

        protected abstract int n1 { get; set; }
        protected abstract int n2 { get; set; }
        protected virtual int n3 { get; set; }
        protected virtual int n4 { get; set; }
        protected virtual int n5 { get; set; }

        public int this[int a]
        {
            get
            {
                return a + 5;
            }
        }

        public int this[byte a]
        {
            get
            {
                return a + 5;
            }
        }

        public virtual int this[short a]
        {
            get
            {
                return a + 5;
            }
        }

        public virtual long this[long a]
        {
            get
            {
                return a + 5;
            }
        }

        public abstract ulong this[ulong a] { get; }
    }

    public abstract class A2 : A1
    {
        private int x4 { get; set; }
        protected int x5 { get; set; }
        public int x6 { get; set; }

        protected override int a1 { get; set; }
        protected override int a2 { get; set; }
        protected abstract int a4 { get; set; }

        protected override int v2 { get; set; }
        protected override int v4 { get; set; }
        protected virtual int v5 { get; set; }
        protected virtual int v6 { get; set; }

        protected override int n1 { get; set; }
        protected override int n2 { get; set; }
        new protected virtual int n3 { get; set; }
        protected override int n4 { get; set; }
        protected override int n5 { get; set; }

        new public int this[int a]
        {
            get
            {
                return a + 5;
            }
        }

        new public virtual int this[byte a]
        {
            get
            {
                return a + 5;
            }
        }

        new public virtual int this[short a]
        {
            get
            {
                return a + 5;
            }
        }

        public override long this[long a]
        {
            get
            {
                return a + 5;
            }
        }

        public override ulong this[ulong a]
        {
            get
            {
                return a + 5;
            }
        }
    }

    public class A3 : A2
    {
        private int x7 { get; set; }
        protected int x8 { get; set; }
        public int x9 { get; set; }

        protected override int a2 { get; set; }
        protected override int a3 { get; set; }
        protected override int a4 { get; set; }

        protected override int v3 { get; set; }
        protected override int v4 { get; set; }
        protected override int v5 { get; set; }

        new protected virtual int n1 { get; set; }
        new protected int n2 { get; set; }
        new protected virtual int n3 { get; set; }
        new protected virtual int n4 { get; set; }
        new protected int n5 { get; set; }
    }
}
